package com.ruoyi.web.controller.system;

import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.oss.cloud.OSSFactory;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.wx.domain.WxMaForm;
import com.ruoyi.wx.service.WxMaCodeService;
import com.ruoyi.wx.service.WxMaUserService;
import cn.hutool.core.date.DateUtil;

/**
 * 个人信息 业务处理
 * 
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/user/profile")
public class SysProfileController extends BaseController
{
    @Autowired
    private ISysUserService userService;

    @Autowired
    private TokenService tokenService;
    
    @Autowired
    private WxMaUserService wxMaUserService;
    
    @Autowired
	private WxMaCodeService wxMaCodeService;
    
    @Autowired
	private RedisCache redisCache;
    
    public final static String KEY_USER = "key:user:";
    
    public final static String KEY_USER_TOTAL = "key:user:total";
    
    /**
     * 个人信息
     */
    @GetMapping
    public AjaxResult profile()
    {
        LoginUser loginUser = getLoginUser();
        SysUser user = loginUser.getUser();
        AjaxResult ajax = AjaxResult.success(user);
        ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
        ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
        return ajax;
    }

    /**
     * 修改用户
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult updateProfile(@RequestBody SysUser user)
    {
        LoginUser loginUser = getLoginUser();
        SysUser sysUser = userService.getById(loginUser.getUserId());
        
        if("3".equals(sysUser.getStatus())){
        	return AjaxResult.success();
        }
        
        if(sysUser.getIdCardStatus().equals("1")){
        	user.setAge(sysUser.getAge());
        	user.setSex(sysUser.getSex());
        }
        
        if(StringUtils.isNotBlank(user.getWechat())){
        	if(user.getWechat().contains("wxid_")){
        		return AjaxResult.error("微信号不正确");
        	}
        }
        
        if(StringUtils.isNotBlank(user.getNickName())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setMessage(user.getNickName());
        	wxMaForm.setOpenId(sysUser.getOpenId());
        	Boolean checkMessage = wxMaUserService.checkMessage(wxMaForm);
        	if(!checkMessage){
        		throw new ServiceException("昵称涉嫌违规");
        	}
        	if(StringUtils.getMatch(user.getNickName())){
        		throw new ServiceException("昵称涉嫌违规");
        	}
        }
        
        if(StringUtils.isNotBlank(user.getSignName())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setMessage(user.getSignName());
        	wxMaForm.setOpenId(sysUser.getOpenId());
        	Boolean checkMessage = wxMaUserService.checkMessage(wxMaForm);
        	if(!checkMessage){
        		throw new ServiceException("签名涉嫌违规");
        	}
        	if(StringUtils.getMatch(user.getSignName())){
        		throw new ServiceException("签名涉嫌违规");
        	}
        }
        
        if(StringUtils.isNotBlank(user.getProfession())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setMessage(user.getProfession());
        	wxMaForm.setOpenId(sysUser.getOpenId());
        	Boolean checkMessage = wxMaUserService.checkMessage(wxMaForm);
        	if(!checkMessage){
        		throw new ServiceException("职业涉嫌违规");
        	}
        	if(StringUtils.getMatch(user.getProfession())){
        		throw new ServiceException("职业涉嫌违规");
        	}
        }
        
        if(StringUtils.isNotBlank(user.getHobby())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setMessage(user.getHobby());
        	wxMaForm.setOpenId(sysUser.getOpenId());
        	Boolean checkMessage = wxMaUserService.checkMessage(wxMaForm);
        	if(!checkMessage){
        		throw new ServiceException("兴趣爱好涉嫌违规");
        	}
        	if(StringUtils.getMatch(user.getHobby())){
        		throw new ServiceException("兴趣爱好涉嫌违规");
        	}
        }
        
        if(StringUtils.isNotBlank(user.getIntroduce())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setMessage(user.getIntroduce());
        	wxMaForm.setOpenId(sysUser.getOpenId());
        	Boolean checkMessage = wxMaUserService.checkMessage(wxMaForm);
        	if(!checkMessage){
        		throw new ServiceException("自我介绍涉嫌违规");
        	}
        	if(StringUtils.getMatch(user.getIntroduce())){
        		throw new ServiceException("自我介绍涉嫌违规");
        	}
        }
        
        user.setUserName(sysUser.getUserName());
        user.setUserId(sysUser.getUserId());
        user.setPassword(null);
        if(user.getBirthday() != null){
        	int age = DateUtil.ageOfNow(user.getBirthday());
        	user.setAge(age);
        }
        if(StringUtils.isNotBlank(user.getBirthDate())){
        	int age = DateUtil.ageOfNow(user.getBirthDate());
        	user.setAge(age);
        }
        
        if(StringUtils.isNotBlank(user.getAlbums())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setUrl(user.getAlbums());
        	String imageLock = wxMaCodeService.getQrCode(wxMaForm);
            user.setImageLock(imageLock);
        }
        
        /*SysUser su = userService.getById(sysUser.getUserId());
        if(StringUtils.isBlank(su.getSex())){
        	if("1".equals(user.getSex())){
            	// 女生送趣豆
            	PayCoinUserForm payCoinUserForm = new PayCoinUserForm();
    	    	payCoinUserForm.setCoinNum(100);
    	    	payCoinUserForm.setCoinType("0");
    	    	payCoinUserForm.setRemark("注册奖励");
    	    	payCoinUserForm.setUserId(sysUser.getUserId());
    	    	coinUserService.savePayCoinUser(payCoinUserForm);
            }
        }*/
        if (userService.updateUserProfile(user) > 0){
            // 更新缓存用户信息
            sysUser.setNickName(user.getNickName());
            sysUser.setSignName(user.getSignName());
            sysUser.setPhonenumber(user.getPhonenumber());
            sysUser.setEmail(user.getEmail());
            sysUser.setSex(user.getSex());
            sysUser.setAge(user.getAge());
            tokenService.setLoginUser(loginUser);
            return AjaxResult.success();
        }
        
        return AjaxResult.error("修改个人信息异常，请联系管理员");
    }
    
    /**
     * 修改用户
     */
    @PostMapping("edit")
    public AjaxResult edit(@RequestBody SysUser user) {
        SysUser u = userService.getById(SecurityUtils.getUserId());
        if(StringUtils.isNotBlank(user.getNickName())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(u.getAppId());
        	wxMaForm.setMessage(user.getNickName());
        	wxMaForm.setOpenId(u.getOpenId());
        	Boolean checkMessage = wxMaUserService.checkMessage(wxMaForm);
        	if(!checkMessage){
        		throw new ServiceException("昵称涉嫌违规");
        	}
        }
        
        u.setNickName(user.getNickName());
        u.setSex(user.getSex());
        u.setAvatar(user.getAvatar());
        userService.updateById(u);
        return AjaxResult.success();
    }
    
    /**
     * 修改用户
     */
    @PostMapping("welcome")
    public AjaxResult welcome(@RequestBody SysUser user)
    {
        LoginUser loginUser = getLoginUser();
        SysUser sysUser = loginUser.getUser();
        SysUser u = userService.getById(sysUser.getUserId());
        if("https://thirdwx.qlogo.cn/mmopen/vi_32/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg/0".equals(u.getAvatar())){
        	return AjaxResult.error("请上传头像");
        }
        /*SysUser u = userService.getById(sysUser.getUserId());
        if(0 == u.getIsWelcome().intValue()){
        	// 赠送趣币
        	PayCoinUserForm payCoinUserForm = new PayCoinUserForm();
        	payCoinUserForm.setCoinNum(100);
        	payCoinUserForm.setCoinType("0");
        	payCoinUserForm.setRemark("注册奖励");
        	payCoinUserForm.setUserId(sysUser.getUserId());
        	coinUserService.savePayCoinUser(payCoinUserForm);
        }*/
        
        if(StringUtils.isNotBlank(user.getWechat())){
        	if(user.getWechat().contains("wxid_")){
        		return AjaxResult.error("微信号不正确");
        	}
        }
        
        /*if("1".equals(user.getSex())){
        	// 女生送趣豆
        	PayCoinUserForm payCoinUserForm = new PayCoinUserForm();
	    	payCoinUserForm.setCoinNum(100);
	    	payCoinUserForm.setCoinType("0");
	    	payCoinUserForm.setRemark("注册奖励");
	    	payCoinUserForm.setUserId(sysUser.getUserId());
	    	coinUserService.savePayCoinUser(payCoinUserForm);
        }*/
        
        user.setUserName(sysUser.getUserName());
        if (StringUtils.isNotEmpty(user.getPhonenumber())
                && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
        {
            return AjaxResult.error("修改用户'" + user.getUserName() + "'失败，手机号码已存在");
        }
        if (StringUtils.isNotEmpty(user.getEmail())
                && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
        {
            return AjaxResult.error("修改用户'" + user.getUserName() + "'失败，邮箱账号已存在");
        }
        user.setUserId(sysUser.getUserId());
        user.setPassword(null);
        if(StringUtils.isNotBlank(user.getBirthDate())){
        	int age = DateUtil.ageOfNow(user.getBirthDate());
        	user.setAge(age);
        }
        if (userService.updateUserProfile(user) > 0){
            // 更新缓存用户信息
            sysUser.setNickName(user.getNickName());
            sysUser.setSignName(user.getSignName());
            sysUser.setPhonenumber(user.getPhonenumber());
            sysUser.setEmail(user.getEmail());
            sysUser.setSex(user.getSex());
            sysUser.setAge(user.getAge());
            tokenService.setLoginUser(loginUser);
            
            return AjaxResult.success();
        }
        
        redisCache.deleteKeyPre(KEY_USER);
        redisCache.deleteKeyPre(KEY_USER_TOTAL);
        
        return AjaxResult.error("修改个人信息异常，请联系管理员");
    }
    
    /**
     * 修改用户
     */
    @PostMapping("update")
    public AjaxResult update(@RequestBody SysUser user) {
        LoginUser loginUser = getLoginUser();
        SysUser sysUser = loginUser.getUser();
        
        if(StringUtils.isNotBlank(user.getWechat())){
        	if(user.getWechat().contains("wxid_")){
        		return AjaxResult.error("微信号不正确");
        	}
        }
        
        if(StringUtils.isNotBlank(user.getAlbums())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setUrl(user.getAlbums());
        	String imageLock = wxMaCodeService.getQrCode(wxMaForm);
        	if(StringUtils.isNotBlank(imageLock)){
        		return AjaxResult.error("相册不能有二维码");
        	}
        }
        
        if(StringUtils.isNotBlank(user.getNickName())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setMessage(user.getNickName());
        	wxMaForm.setOpenId(sysUser.getOpenId());
        	Boolean checkMessage = wxMaUserService.checkMessage(wxMaForm);
        	if(!checkMessage){
        		throw new ServiceException("昵称内容违规");
        	}
        	if(StringUtils.getMatch(user.getNickName())){
        		throw new ServiceException("昵称内容违规");
        	}
        }
        
        if(StringUtils.isNotBlank(user.getSignName())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setMessage(user.getSignName());
        	wxMaForm.setOpenId(sysUser.getOpenId());
        	Boolean checkMessage = wxMaUserService.checkMessage(wxMaForm);
        	if(!checkMessage){
        		throw new ServiceException("签名内容违规");
        	}
        	if(StringUtils.getMatch(user.getSignName())){
        		throw new ServiceException("签名内容违规");
        	}
        }
        
        if(StringUtils.isNotBlank(user.getIntroduce())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setMessage(user.getIntroduce());
        	wxMaForm.setOpenId(sysUser.getOpenId());
        	Boolean checkMessage = wxMaUserService.checkMessage(wxMaForm);
        	if(!checkMessage){
        		throw new ServiceException("关于我内容违规");
        	}
        	if(StringUtils.getMatch(user.getIntroduce())){
        		throw new ServiceException("关于我内容违规");
        	}
        }
        
        if(StringUtils.isNotBlank(user.getHobby())){
        	WxMaForm wxMaForm = new WxMaForm();
        	wxMaForm.setAppId(sysUser.getAppId());
        	wxMaForm.setMessage(user.getHobby());
        	wxMaForm.setOpenId(sysUser.getOpenId());
        	Boolean checkMessage = wxMaUserService.checkMessage(wxMaForm);
        	if(!checkMessage){
        		throw new ServiceException("关于对方内容违规");
        	}
        	if(StringUtils.getMatch(user.getHobby())){
        		throw new ServiceException("关于对方内容违规");
        	}
        }
        
        user.setUserId(sysUser.getUserId());
        user.setPassword(null);
        if(user.getBirthday() != null){
        	int age = DateUtil.ageOfNow(user.getBirthday());
        	user.setAge(age);
        }
        user.setIsShow("1");
        userService.updateUserProfile(user);
        return AjaxResult.success();
    }

    /**
     * 重置密码
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PutMapping("/updatePwd")
    public AjaxResult updatePwd(String oldPassword, String newPassword)
    {
        LoginUser loginUser = getLoginUser();
        String userName = loginUser.getUsername();
        String password = loginUser.getPassword();
        if (!SecurityUtils.matchesPassword(oldPassword, password))
        {
            return AjaxResult.error("修改密码失败，旧密码错误");
        }
        if (SecurityUtils.matchesPassword(newPassword, password))
        {
            return AjaxResult.error("新密码不能与旧密码相同");
        }
        if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0)
        {
            // 更新缓存用户密码
            loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword));
            tokenService.setLoginUser(loginUser);
            return AjaxResult.success();
        }
        return AjaxResult.error("修改密码异常，请联系管理员");
    }

    /**
     * 头像上传
     */
    @Log(title = "用户头像", businessType = BusinessType.UPDATE)
    @PostMapping("/avatar")
    public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
    {
        if (!file.isEmpty())
        {
            LoginUser loginUser = getLoginUser();
            String extension = FilenameUtils.getExtension(file.getOriginalFilename());
			String avatar = OSSFactory.build().uploadSuffix(file.getBytes(), extension);
			// 正常用户需要校验合法性
			String checkMsg = OSSFactory.build().check(avatar);
			if(StringUtils.isNotBlank(checkMsg)){
				throw new ServiceException(checkMsg);
			}
            if (userService.updateUserAvatar(loginUser.getUserId(), avatar))
            {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("imgUrl", avatar);
                // 更新缓存用户头像
                loginUser.getUser().setAvatar(avatar);
                tokenService.setLoginUser(loginUser);
                return ajax;
            }
        }
        return AjaxResult.error("上传图片异常，请联系管理员");
    }
    
    /**
     * 头像上传
     */
    @Log(title = "用户头像", businessType = BusinessType.UPDATE)
    @PostMapping("/uploadAvatar")
    public AjaxResult uploadAvatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
    {
        if (!file.isEmpty())
        {
            String extension = FilenameUtils.getExtension(file.getOriginalFilename());
			String avatar = OSSFactory.build().uploadSuffix(file.getBytes(), extension);
			// 正常用户需要校验合法性
			String checkMsg = OSSFactory.build().check(avatar);
			if(StringUtils.isNotBlank(checkMsg)){
				throw new ServiceException(checkMsg);
			}
			AjaxResult ajax = AjaxResult.success();
            ajax.put("imgUrl", avatar);
            return ajax;
        }
        return AjaxResult.error("上传图片异常，请联系管理员");
    }
    
    /**
     * 身份证正面上传
     */
    @Log(title = "身份证正面", businessType = BusinessType.UPDATE)
    @PostMapping("/idCardFront")
    public AjaxResult idCardFront(@RequestParam("idCardFile") MultipartFile file) throws Exception
    {
        if (!file.isEmpty())
        {
            LoginUser loginUser = getLoginUser();
            String extension = FilenameUtils.getExtension(file.getOriginalFilename());
			String idCardFront = OSSFactory.build().uploadSuffix(file.getBytes(), extension);
            if (userService.updateUserIdCardFront(loginUser.getUserId(), idCardFront))
            {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("imgUrl", idCardFront);
                return ajax;
            }
        }
        return AjaxResult.error("上传图片异常，请联系管理员");
    }
    
    /**
     * 身份证反面上传
     */
    @Log(title = "身份证反面", businessType = BusinessType.UPDATE)
    @PostMapping("/idCardBack")
    public AjaxResult idCardBack(@RequestParam("idCardFile") MultipartFile file) throws Exception
    {
        if (!file.isEmpty())
        {
            LoginUser loginUser = getLoginUser();
            String extension = FilenameUtils.getExtension(file.getOriginalFilename());
			String idCardBack = OSSFactory.build().uploadSuffix(file.getBytes(), extension);
            if (userService.updateUserIdCardBack(loginUser.getUserId(), idCardBack))
            {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("imgUrl", idCardBack);
                return ajax;
            }
        }
        return AjaxResult.error("上传图片异常，请联系管理员");
    }
}
